DMelt:AI/1 Backpropagation Neural Net
Backpropagation
This section devoted to one of the most popular neural net: backpropagation. Read Backpropagation article.
Neural Network using Python
The best way to get started with Neural Networks is to a look at a simply Python code which implements a back propagation neural net. In your DataMelt installation, look at the Python file:
Go to "Tools" and then "Online examples": Artificial Intelligence/neural net/neural_net_bpnn.py
Open it with DataMelt IDE and study it - it is simple and well documented. It is self-contained and does not require Java libraries (so you can modify and rerun it at your convenience). This code creates a neural network with two input, two hidden, and one output nodes. The training sample is given by the matrix, where the first 2 columns are input, and the last column is output.
[[0,0], 0]], [[0,1], [1]], [[1,0], [1]], [[1,1], [0]]
Open it with DataMelt IDE and run it (press [F8]). You will see the output like this:
error 0.849818 error 0.057854 error 0.003672 error 0.001686 error 0.001081 error 0.000792 error 0.000630 error 0.000527 error 0.000445 error 0.000384 [0, 0] -> [-0.021372111181607808] [0, 1] -> [0.9824168796884087] [1, 0] -> [0.9822863753023391] [1, 1] -> [0.022461131355512465]
The output of this scripts gives the training error, and the last lines are the predictions after the training.
Neural Network using Java
DataMelt contains several powerful Java libraries for unsupervised learning procedures. Unlike Python, libraries implemented in Java is by a factor 10-20 faster. Let us show how to use Jython (or any Java scripting language) to create and run a backpropogation network. This library uses the Encog engine from Heaton Research.
Below we show a simple neural net which reads CSV file, train network using 4-hiden layers and validate it. The input file looks like this:
0,0,0 1,0,1 0,1,1 1,1,0
Here is a simple 5-line code which performs neural net training.
# Licensed under the Apache License, Version 2.0 (the "License"); # based on http://www.heatonresearch.com/encog/ """ /** * XOR: This example is essentially the "Hello World" of neural network * programming. This example shows how to construct an Encog neural network to * predict the output from the XOR operator. This example uses resilient * propagation (RPROP) to train the neural network. RPROP is the best general * purpose supervised training method provided by Encog. * * For the XOR example with RPROP I use 4 hidden neurons. XOR can get by on just * 2, but often the random numbers generated for the weights are not enough for * RPROP to actually find a solution. RPROP can have issues on really small * neural networks, but 4 neurons seems to work just fine. * * This example reads the XOR data from a CSV file. This file should be * something like: * **/ """ from org.encog import Encog from org.encog.util.csv import CSVFormat from org.encog.util.simple import EncogUtility,TrainingSetUtil # create data file data=""" 0,0,0 1,0,1 0,1,1 1,1,0 """ name="test.csv" fi=open(name, "w") fi.write(data) fi.close() trainingSet=TrainingSetUtil.loadCSVTOMemory(CSVFormat.ENGLISH,name,False,2,1) network=EncogUtility.simpleFeedForward(2,4,0,1,True) EncogUtility.trainToError(network, trainingSet, 0.01) EncogUtility.evaluate(network, trainingSet) Encog.getInstance().shutdown()
This example uses several important Java classes:
- TrainingSetUtil - to help to read CSV file with input
- EncogUtility - used for training
Now we will extend this example by putting a few more lines:
- Show the network structure in a separate window
- Build network analyser to extract weights, data etc.
- Save the network in a separate file and restore it
The script which does all of this is shown below:
# Licensed under the Apache License, Version 2.0 (the "License"); # based on http://www.heatonresearch.com/encog/ """ /** * XOR: This example is essentially the "Hello World" of neural network * programming. This example shows how to construct an Encog neural network to * predict the output from the XOR operator. This example uses resilient * propagation (RPROP) to train the neural network. RPROP is the best general * purpose supervised training method provided by Encog. * * For the XOR example with RPROP I use 4 hidden neurons. XOR can get by on just * 2, but often the random numbers generated for the weights are not enough for * RPROP to actually find a solution. RPROP can have issues on really small * neural networks, but 4 neurons seems to work just fine. * * This example reads the XOR data from a CSV file. This file should be * something like: * **/ """ from org.encog import Encog from org.encog.util.csv import CSVFormat from org.encog.util.simple import EncogUtility,TrainingSetUtil from org.encog.visualize import NetworkVisualizeFrame from org.encog.neural.networks.structure import AnalyzeNetwork from org.encog.util.obj import SerializeObject from java.io import * # create data file data=""" 0,0,0 1,0,1 0,1,1 1,1,0 """ name="test.csv" fi=open(name, "w") fi.write(data) fi.close() trainingSet=TrainingSetUtil.loadCSVTOMemory(CSVFormat.ENGLISH,name,False,2,1) net=EncogUtility.simpleFeedForward(2,4,0,1,True) EncogUtility.trainToError(net, trainingSet, 0.01) EncogUtility.evaluate(net, trainingSet) SerializeObject.save(File("network.eg"), net) # save # restore the network network=SerializeObject.load(File("network.eg")) f=NetworkVisualizeFrame(network) f.setDefaultCloseOperation(1) f.setVisible(1) print "analyze network" a=AnalyzeNetwork(network) print "Analyze network:" a=AnalyzeNetwork(net) print a.toString() print "Values=",a.getAllValues() print "Weights=",a.getWeightValues() print "Nr of connections=",a.getTotalConnections()
This script generates a pop-up JFrame with the network structure:
Neural Network scripting
This time we will customize the network. Instead of using predefined factories, we build actual objects and redefine the activation functions. We also use a script to input data.
As before, we will use a simple input with 2 inputs, which will look like this:
XOR_INPUT = [ [ 0.0, 0.0 ], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]] # 2 inputs XOR_IDEAL = [ [ 0.0 ], [1.0], [1.0], [0.0]] # output
Here is Java code which performs backpropogation network analysis:
# Licensed under the Apache License, Version 2.0 (the "License"); # based on http://www.heatonresearch.com/encog/ # This example shows how to construct an Encog neural # network to predict the output from the XOR operator. This example # uses backpropagation to train the neural network. from org.encog.ml.data.basic import BasicMLDataSet from org.encog.neural.networks import BasicNetwork from org.encog.neural.networks.layers import BasicLayer from org.encog.neural.networks.training.propagation.resilient import ResilientPropagation from org.encog.engine.network.activation import ActivationSigmoid XOR_INPUT = [ [ 0.0, 0.0 ], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]] XOR_IDEAL = [ [ 0.0 ], [1.0], [1.0], [0.0]] network = BasicNetwork() network.addLayer(BasicLayer(None,True,2)) network.addLayer(BasicLayer(ActivationSigmoid(),True,3)) network.addLayer(BasicLayer(ActivationSigmoid(),False,1)) network.getStructure().finalizeStructure() network.reset() # train trainingSet = BasicMLDataSet(XOR_INPUT, XOR_IDEAL) train = ResilientPropagation(network, trainingSet) # train network # iterations epoch=1 error=1 while (error > 0.01): train.iteration() error=train.getError() if (epoch%10==0): print "Epoch #", epoch ," Error:",error epoch+=1 print "-> Test Trained Neural Network" for pair in trainingSet: output = network.compute(pair.getInput()) print pair.getInput().getData(0), "," , pair.getInput().getData(1), ", actual=", output.getData(0), ",ideal=",pair.getIdeal().getData(0)
The same script will print the result of training:
Epoch # 10 Error: 0.238874112686 Epoch # 20 Error: 0.195396962817 Epoch # 30 Error: 0.126547597192 Epoch # 40 Error: 0.0592342636102 Epoch # 50 Error: 0.0286886069541 Epoch # 60 Error: 0.0100759401001 -> Test Trained Neural Network 0.0 , 0.0 , actual= 0.112184658782 ,ideal= 0.0 1.0 , 0.0 , actual= 0.958848378144 ,ideal= 1.0 0.0 , 1.0 , actual= 0.902418114956 ,ideal= 1.0 1.0 , 1.0 , actual= 0.0811959953326 ,ideal= 0.0
As you can see, the predicted values are rather close to the expected.
Neural Networks using the neuroph packag
You can build and train neural nets using the neuroph package. org/neuroph/nnet/MultiLayerPerceptron. This is Java implementation and should be rather fast. Look at a simple example for multi-layer perceptron for the XOR problem:
from jhplot import * from jhplot.io import * from org.neuroph.core.data import DataSet from org.neuroph.core.data import DataSetRow from org.neuroph.nnet import MultiLayerPerceptron from org.neuroph.util import TransferFunctionType from org.neuroph.core import NeuralNetwork data=DataSet(2, 1) data.addRow(DataSetRow([0,0],[0])) data.addRow(DataSetRow([0,1],[1])) data.addRow(DataSetRow([1,0],[1])) data.addRow(DataSetRow([1,1],[0])) # 2 inputs, 3 midle layers, 1 output myMlP = MultiLayerPerceptron(TransferFunctionType.TANH, [2, 3, 1]); learningRule = myMlP.getLearningRule() learningRule.setBatchMode(True) print "Training neural network..." myMlP.learn(data) print "Training done! Save NN" myMlP.save("myMlPerceptron.nnet"); print "Read saved .." nnet =NeuralNetwork.createFromFile("myMlPerceptron.nnet"); print "Testing.." for dataRow in data.getRows(): nnet.setInput(dataRow.getInput().tolist()) nnet.calculate() networkOutput = nnet.getOutput(); print "Input: ", dataRow.getInput().tolist() print " Output: ", networkOutput.tolist()
and run it inside the DataMelt. It trains and then check th result of the run. DataMelt also includes a similar example but written in Java.
Backpropogation based on HNeuralNet
Below we will show a simple example how to use neural networks using the class HNeuralNet which is designed for backpropogation neural networks. This library uses the Encog engine from Heaton Research, but restructured for simple scripting using Jython, BeanShell or Groovy or JRuby.
First, let us create a file with our input data which will be analyzed later using a neural network.
from java.util import Random from jhplot import * from jhplot.io import * fin=PND('Input Data'); out=PND('Output value') r= Random() for i in range(300): # 3000 events x1=r.nextDouble() # each event has 5 inputs and 1 output x2=0.5*r.nextDouble() x3=r.nextDouble()+0.01 x4=1.2*r.nextDouble()+0.01 x5=0.2*r.nextDouble() fin.add([x1,x2,x3,x4,x5]) # 5 values with input out.add([x1+x4+x2+x3*x5]) # 1 output from 5 inputs d={'input':fin,'out':out} Serialized.write(d,'data.ser') # serialize data into a file print "File data.ser was created!"
Our data structure is represented in the form of dictionary, with two string keys: 'input' (represented by PND array) and 'output' (also represented by a PND array), but consists only one number. Our output is a function of 4 random inputs. The goal of our neural net is to rediscover the relation between 5 inputs and the output, pretending that we know nothing about the such dependence.
Below we analyze this data in the file data.ser using a back propogation artificial neural network. The goal is make predictions on the output value knowing the input variables.
The principle of back propagation is actually quite easy to understand. The basic steps are:
- Initialize the network with small random weights
- Present an input pattern to the input layer of the network
- Feed the input pattern forward through the network to calculate its activation value
- Take the difference between desired output and the activation value to calculate the network’s activation error
- Adjust the weights feeding the output neuron to reduce its activation error for this input pattern
- Propagate an error value back to each hidden neuron that is proportional to their contribution of the network’s activation error.
- Adjust the weights feeding each hidden neuron to reduce their contribution of error for this input pattern.
- Repeat steps 2 to 7 for each input pattern in the input collection.
- Repeat step 8 until the network is suitably trained.
For such iterations, each pattern is presented in turn, and the network adjusted slightly, before moving on to the next pattern. The magic really happens in step 6, which determines how much error to feed back to each hidden neuron. Once the error value has been established, training can continue.
A next step is to build a backpropogation artificial neural network with 5 inputs, 3 hidden layers and one output.
from jhplot import * from jhplot.io import * net = HNeuralNet() net.addFeedForwardLayer(5) net.addFeedForwardLayer(3) net.addFeedForwardLayer(1) net.reset() net.save("test.eg") net.showNetwork()
This script builds this topology for neural net:
For convenience, we randomize inputs and save it into a file "test.eg". The output of this script is shown here: The output file "test.eg" defines neural net; just open this file in any editor and you will find a simple XML definitions of our neural net.
You can find details of the class HNeuralNet here. Once the neural net is saved, one can restore it an any time:
from jhplot import * net = HNeuralNet() net.read("test.eg","myNN") # the name myNN should be the same as in the example above net.showNetwork()
Now we have prepared data and NN. Next step is to train the NN using the input data. It should be noted that it is desirable to rescale the input values so they will be between [-1,1]. This is explained in more details in the book. Here we will just use the original data for simplicity.
from jhplot import * from jhplot.io import * d=Serialized.read('data.ser') input=d['input'].getRows('input',0,100) out=d['out'].getRows('result',0,100) net = HNeuralNet() net.read("test.eg") # read NN from a file net.setData(input, out) print net.trainBackpropagation(1,1000,0.001,0.02,0.005) print "Epoch error=",net.getEpochError() net.save("test_trained.eg") net.showNetwork() # show network net.showWeights() # show weight
Neural Net with input CSV data
In this example we build a neural net using CSV input data as shown below. First 2 columns are input, while the last column is output.
0.10, 0.03, 0 0.11, 0.11, 0 0.11, 0.82, 0 0.13, 0.17, 0 0.20, 0.81, 0 0.21, 0.57, 1 0.25, 0.52, 1 0.26, 0.48, 1 0.28, 0.17, 1 0.28, 0.45, 1 0.37, 0.28, 1 0.41, 0.92, 0 0.43, 0.04, 1 0.44, 0.55, 1 0.47, 0.84, 0 0.50, 0.36, 1 0.51, 0.96, 0 0.56, 0.62, 1 0.65, 0.01, 1 0.67, 0.50, 1 0.73, 0.05, 1 0.73, 0.90, 0 0.73, 0.99, 0 0.78, 0.01, 1 0.83, 0.62, 0 0.86, 0.42, 1 0.86, 0.91, 0 0.89, 0.12, 1 0.95, 0.15, 1 0.98, 0.73, 0
In the code below we read this input file and perform backpropogation. The the script shows the structure of neural net, errors as a function of the epoch and the predicted values.
from jhplot import * from jhplot.io.csv import * from java.io import * reader =CSVReader( FileReader("/home/sergei/Download/data.csv")) input=PND("input") output=PND("output") while True: nextLine = reader.readNext() if nextLine== None: break input.add([float(nextLine[0]),float(nextLine[1])]) output.add([float(nextLine[2])]) net = HNeuralNet() # build NN with 2 hidden layers net.addFeedForwardLayer(2) net.addFeedForwardLayer(2) net.addFeedForwardLayer(1) net.reset() net.showNetwork() net.setData(input, output) print net.trainBackpropagation(1,5000,0.01,0.025,0.002) print "Epoch error=",net.getEpochError() pred=net.predict(input) for or i in range( input.size() ): print "predicted=",pred.get(i)[0], " expected=",output.get(i)[0]
The code generates a neural net as shown here:
Neural Network for predictions
In this example we will show how to:
- Creating input data set
- Normalizing the input
- Construction of NN
- Analyzing the output
You can find below a script which does all the above. In addition, it will show the learning rate, the neural net diagram and will print expected and predicted values. The example also shows how to save a neural net in a file and then read it back:
from java.util import Random from jhplot import * from jhplot.io import * Events=1000 input=PND('Data') out=PND('Output') r= Random() for i in range(Events): mass=r.nextDouble()*10 acceler=r.nextDouble()*10 force=mass*acceler input.add([mass,acceler]) out.add([force]) d={'input':input,'out':out} # scale output input=d['input'] out=d["out"] # scale_input=input.rescale(1) # scale_output=out.rescale(1) input.standardize() scale=out.rescale(0) # print input # print out # import sys # sys.exit(0) input=d['input'].getRows('input',0,(int)(0.5*Events)) out=d['out'].getRows('result',0,(int)(0.5*Events)) net = HNeuralNet() net.addFeedForwardLayer(2) net.addFeedForwardLayer(2) net.addFeedForwardLayer(1) net.reset() net.setData(input, out) print net.trainBackpropagation(1,5000,0.01,0.025,0.002) print "Epoch error=",net.getEpochError() net.save("test.eg") net.showNetwork() min,max =(int)(0.5*Events),Events input=d['input'].getRows('input',min,max) out=d["out"].getRows('result',min,max) net=HNeuralNet() net.read('test.eg'); pred=net.predict(input) pred.rescale(scale) out.rescale(scale) d={'predicted':pred,'expected':out} predicted=d['predicted'] expected=d['expected'] ratio=predicted.copy('ratio') ratio.oper(expected,'/') c1=HPlot() c1.visible() c1.setRange(0,2,0,100) h=H1D('ratio',50,0,2.) h.fill(ratio) c1.draw(h) c1.drawStatBox(h) for i in range( (int)(0.5*Events)): # check first 100 events p=predicted.getRow(i) x=expected.getRow(i) d1=p.get(0) d2=x.get(0) print i,'predicted=',d1,' expected=',d2
The script generates 3 figures:
- The structure of the neural net with 2 hidden layers
- Error of learning as a function of epoch
- Error on the prediction, i.e. taking the difference between predicted and expected values.
Neural Network using Joone
Joone is another graphical editor and engine for neural networks. This neural net is available as org.joone.net.NeuralNet. Let us a show example that train neural network, show the global error and validate the network. We use "in memory" data, unlike data which can be read from files.
from org.joone.engine import NeuralNetListener from org.joone.engine import SigmoidLayer,FullSynapse,Monitor from org.joone.io import MemoryOutputSynapse,MemoryInputSynapse from org.joone.engine.learning import TeachingSynapse from org.joone.net import NeuralNet from java.lang import System from jhplot import * class joone(NeuralNetListener): mills=0 nnet = NeuralNet() epochs=1000 c1 = SPlot() c1.visible() c1.setAutoRange() c1.setMarksStyle('various') c1.setConnected(1, 0) c1.setNameY('Global Error') c1.setNameX('Epoch') def Go(self,epochs,inputArray,desiredOutput): self.epochs=epochs print "Running NN for ", epochs, " epochs" # First, creates the three Layers input=SigmoidLayer() hidden=SigmoidLayer() output=SigmoidLayer() input.setLayerName("input") hidden.setLayerName("hidden") output.setLayerName("output") input.setRows(2) hidden.setRows(3) output.setRows(1) synapse_IH = FullSynapse() # input -> hidden conn. synapse_HO = FullSynapse() # hidden -> output conn. synapse_IH.setName("IH") synapse_HO.setName("HO") # Connect the input layer with the hidden layer input.addOutputSynapse(synapse_IH) hidden.addInputSynapse(synapse_IH) # Connect the hidden layer with the output layer hidden.addOutputSynapse(synapse_HO) output.addInputSynapse(synapse_HO) inputStream = MemoryInputSynapse() # input array inputStream.setInputArray(inputArray) inputStream.setAdvancedColumnSelector("1-2") # The first two columns contain the input desiredOutputSynapse = MemoryInputSynapse() # desired desiredOutputSynapse.setInputArray(desiredOutput) desiredOutputSynapse.setAdvancedColumnSelector("1") # set the input data input.addInputSynapse(inputStream) trainer = TeachingSynapse() trainer.setDesired(desiredOutputSynapse) output.addOutputSynapse(trainer) # Connects the Teacher to the last layer # Creates a new NeuralNet. All the layers must be inserted self.nnet.addLayer(input, NeuralNet.INPUT_LAYER) self.nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER) self.nnet.addLayer(output, NeuralNet.OUTPUT_LAYER) mon = self.nnet.getMonitor() mon.setTrainingPatterns(len(inputArray)) # of rows (patterns) contained in the input file mon.setTotCicles(self.epochs) # How many times the net must be trained on the input patterns mon.setLearningRate(0.7) mon.setMomentum(0.6) mon.setLearning(True) # The net must be trained mon.setSingleThreadMode(True) # Set to false for multi-thread mode #The application registers itself as monitor's listener so it can receive #the notifications of termination from the net. */ mon.addNeuralNetListener(self) self.mills = System.currentTimeMillis() self.nnet.randomize(0.5) self.nnet.go(True) # The net starts in non async mode def netStopped(self,e): delay = System.currentTimeMillis() - self.mills print "Training finished after ",delay," ms" def cicleTerminated(self,e): pass def netStarted(self,e): pass def errorChanged(self,e): mon = e.getSource() c = self.epochs-mon.getCurrentCicle() cl = c / 1000 if ((cl * 1000) == c): err=mon.getGlobalError() print c," epoch RMSE = ", err self.c1.addPoint(0,c,err,1) self.c1.update() def netStoppedError(self,e): pass def getPredict(self,inputArray): input = self.nnet.getInputLayer() input.removeAllInputs() nsize=len(inputArray) memInp = MemoryInputSynapse() memInp.setFirstRow(1) memInp.setAdvancedColumnSelector("1,2") input.addInputSynapse(memInp) memInp.setInputArray(inputArray) output = self.nnet.getOutputLayer() output.removeAllOutputs() memOut = MemoryOutputSynapse() output.addOutputSynapse(memOut) self.nnet.getMonitor().setTotCicles(1) self.nnet.getMonitor().setTrainingPatterns(nsize) self.nnet.getMonitor().setLearning(False) self.nnet.go(True) # The net starts in non async mode pred=[] for i in range(nsize): pattern = memOut.getNextPattern() # print "Predicted Pattern #",(i+1)," = ",pattern[0] pred.append(pattern[0]) return pred inputArray=[[0.0, 0.0],[0.0, 1.0],[1.0, 0.0],[1.0, 1.0]] desiredOutput=[[0],[1],[1],[0]] xor=joone() xor.Go(20000,inputArray,desiredOutput) print "Stop. Get predictions" pred=xor.getPredict(inputArray) for i in range(len(inputArray)): print inputArray[i],"predicted=",pred[i], " expected=",desiredOutput[i]
The global error as a function of epoch is shown below:
Time series forecast using Joone
Now we will use the Joone Neural Network for forecasting market predictions, using a generated time series in the form cos(x)*sin(x)+Gaussian noise.
from org.joone.engine import NeuralNetListener,TanhLayer,DelayLayer from org.joone.engine import SigmoidLayer,FullSynapse,Monitor from org.joone.io import FileInputSynapse,FileOutputSynapse from org.joone.engine.learning import TeachingSynapse from org.joone.net import NeuralNet from java.lang import System from java.io import * from jhplot import * from java.awt import * import math from java.util import Random class joone(NeuralNetListener): mills=0 epochs=1000 fileName="" nnet = NeuralNet() input = DelayLayer() hidden = SigmoidLayer() output = TanhLayer() # a function to help connect layers def connect(self,layer1, syn, layer2): layer1.addOutputSynapse(syn) layer2.addInputSynapse(syn) def createDataSet(self,fileName,firstRow, lastRow, advColSel): fInput = FileInputSynapse() fInput.setInputFile(File(fileName)) fInput.setFirstRow(firstRow) fInput.setLastRow(lastRow) fInput.setAdvancedColumnSelector(advColSel) return fInput def createNet(self,fileName,epochs,trainingPatterns,temporalWindow): self.epochs=epochs print "Running NN for ", epochs, " epochs" self.fileName=fileName self.input.setTaps(temporalWindow-1) self.input.setRows(1) self.hidden.setRows(15) self.output.setRows(1) self.connect(self.input,FullSynapse(), self.hidden) self.connect(self.hidden,FullSynapse(), self.output) self.input.addInputSynapse(self.createDataSet(self.fileName, 1, trainingPatterns, "1")) trainer = TeachingSynapse() trainer.setDesired(self.createDataSet(self.fileName, 2, trainingPatterns+1, "1")) self.output.addOutputSynapse(trainer) self.nnet.addLayer(self.input, NeuralNet.INPUT_LAYER) self.nnet.addLayer(self.hidden, NeuralNet.HIDDEN_LAYER) self.nnet.addLayer(self.output, NeuralNet.OUTPUT_LAYER) self.mills = System.currentTimeMillis() self.nnet.randomize(0.5) def train(self): mon = self.nnet.getMonitor() mon.setLearningRate(0.2) mon.setMomentum(0.7) mon.setTrainingPatterns(trainingPatterns) mon.setTotCicles(epochs) mon.setPreLearning(temporalWindow) mon.setLearning(True) mon.addNeuralNetListener(self) self.nnet.start() mon.Go() self.nnet.join() def interrogate(self,outputFile): mon = self.nnet.getMonitor() self.input.removeAllInputs() startRow = trainingPatterns - temporalWindow self.input.addInputSynapse(self.createDataSet(self.fileName, startRow+1, startRow+40, "1")) self.output.removeAllOutputs() fOutput = FileOutputSynapse() fOutput.setFileName(outputFile) self.output.addOutputSynapse(fOutput) mon.setTrainingPatterns(40) mon.setTotCicles(1) mon.setLearning(False) self.nnet.start() mon.Go() self.nnet.join() def netStopped(self,e): mon =e.getSource() if (mon.isLearning()): epoch = mon.getTotCicles() - mon.getCurrentCicle() print "Epoch:",epoch," last RMSE=",mon.getGlobalError() else: delay = System.currentTimeMillis() - self.mills print "Training finished after ",delay," ms" def cicleTerminated(self,e): mon = e.getSource() epoch = mon.getTotCicles() - mon.getCurrentCicle() if ((epoch > 0) and ((epoch % 100) == 0)): print "Epoch:",epoch," RMSE=",mon.getGlobalError() def netStarted(self,e): pass def errorChanged(self,e): pass def netStoppedError(self,e): pass r=Random() print "Create a file joone_timeseries.txt with time series cos(x)*sin(x)+noise" f = open("joone_timeseries.txt", "w") for x in range(0,1000): yEst = 0.9*math.cos(x*0.4)*math.sin(0.7*x)+0.02*r.nextGaussian() # cos(x*0.3)*sim(x)+noise f.write( str(yEst) + "\n" ) f.close() # get input file with TimeSeries fileName = "joone_timeseries.txt" print "Downloading .. "+fileName # Web.get("http://datamelt.org/examples/data/"+fileName) trainingPatterns = 200 epochs = 10000 temporalWindow = 20 c1 = HPlot("show data") c1.visible() c1.setRangeX(0,1100) c1.setNameX("time") c1.setNameY("price") c1.setMarginLeft(90) # show data dataIN = [line.strip() for line in open(fileName, 'r')] print "Total data size=",len(dataIN), " For learning=",trainingPatterns p1=P1D("Time series") p1.setDrawLine(True) p1.setPenWidth(1) for i in range(len(dataIN)): p1.add(i,float(dataIN[i])) c1.draw(p1) # run NN for predictions ts=joone() ts.createNet(fileName,epochs,trainingPatterns,temporalWindow) print "Training..." ts.train() ts.interrogate("results1.txt") ts.interrogate("results2.txt") # show predictions data = [line.strip() for line in open("results2.txt", 'r')] p2=P1D("Prediction") p2.setColor(Color.red) p2.setDrawLine(True) for i in range(len(data)): p2.add(len(dataIN)+i,float(data[i])) c1.draw(p2) print "Done."
Here is the output image that shows the original time series and the predicted trends (n red).
As you can see, the neural net correctly predicts the expected behavior.